「このパラメータストア、誰が使ってるん?」の疑問を解消するための CloudTrail とAthena の使い方
「あれ。。このパラメータストア、誰が使ってるんだっけ。」
(なんか最近読んだような入り方ですが…) 今回、SSM パラメータストアを整理する機会がありましたが、使ってるのか、使ってないのか判断に迷うところがあったので、CloudTrail と Athena を使って調査した方法をまとめます。
まず CloudTrail だけでやってみる
CloudTrail のイベント履歴を開き、[イベント名] [GetParameters] で検索してやると、パラメータストアを取得した履歴が表示されます。
ただ、これだとどのパラメータを GetParameters したのか判りません。ここから [イベントの表示] をクリックすると、以下のような詳細が表示され、はじめてパラメータストアの名前が判別できます。
正直、これを1件、1件やっていくのは無理ですよね。そうなると、Athena でサクッと検索したくなりますよね
Athena でクエリを実行
CloudTrail ログを Athena に取り込む
CloudTrail ログを Athena に取り込むのは非常に簡単です。CloudTrail のイベント履歴を開き、画面上部のリンクをクリックするだけです。
テーブル作成の画面が開きますので、CloudTrail ログを保存している S3 バケットを選択します。
保存している CloudTrail ログをすべて取り込んでよければ、このまま [テーブル作成] をクリックします。 が、全部の期間はログが多いし欲しくない、というときは、一旦このクエリをコピペして置いておきます。
次に、Athena の管理コンソールを開きます。テーブルを取り込みたいデータベースを選択し(今回は default)、先ほどのクエリを貼り付けます。
次に、クエリの下部に以下のような行があるかと思います。
COMMENT 'CloudTrail table for <YOUR_BUCKET_NAME> bucket' ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://<YOUR_BUCKET_NAME>/AWSLogs/<YOUR_ACCOUNT_ID>/CloudTrail/' TBLPROPERTIES ('classification'='cloudtrail');
LOCATION の部分に S3 のプレフィックスを付与することで、取り込み範囲を限定することが出来ます。当環境では /CloudTrail/
の直下に /リージョン/YYYY/MM/DD
という形式でプレフィックスが切られていましたので、今回は 東京リージョンの 2020 年のログだけに絞るとしましょう。
COMMENT 'CloudTrail table for <YOUR_BUCKET_NAME> bucket' ROW FORMAT SERDE 'com.amazon.emr.hive.serde.CloudTrailSerde' STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://<YOUR_BUCKET_NAME>/AWSLogs/<YOUR_ACCOUNT_ID>/CloudTrail/ap-northeast-1/2020/' TBLPROPERTIES ('classification'='cloudtrail');
プレフィックスを追記したら [クエリの実行] をクリックし、テーブルを作成します。以下のようなクエリを実行し、結果が返ってきたらテーブルの作成は正常に完了しています。
SELECT * FROM "default"."先ほどの TABLE_NAME" limit 10;
クエリを実行する
準備が整いましたので、クエリを投げましょう。今回は以下のようなログを抽出するクエリを実行します。
対象パラメータ | 検索する値 | 備考 |
---|---|---|
eventsource | ssm.amazonaws.com | |
eventname | GetParameter および GetParameters | ”s”あり、なし、いずれでもパラメータストアを取得できるため |
パラメータストア名 | test-secure-string | 各自、検索したい名前に変更 |
今回は該当のパラメータストアに対して、どの IAM ユーザもしくは、ロールがアクセスしたかを知りたかったので、クエリは以下のようにしました。
SELECT useridentity.arn AS userid_arn, useridentity.sessionContext.sessionIssuer.arn AS sessionuser_arn FROM "default"."<TABLE_NAME>" WHERE eventsource = 'ssm.amazonaws.com' AND eventname IN ('GetParameter', 'GetParameters') AND requestparameters LIKE '%"<PARAMETER_STORE_NAME>"%' group by 1,2
得られた結果がこのようになりました。
今回のケースだと、arn:aws:iam::XXXXXXXXXXXX:user/test-user
と arn:aws:iam::XXXXXXXXXXXX:role/cm-marumo.atsushi
が利用しているパラメータであることが判りました。
検証は以上です!
さいごに
アテナを使って、パラメータストアの整理をしました。AWS
リソースを"こんまりメソッド"のように断捨離していくのは気持ち
が良いです!SQL はあまり書いた経験がなかったので、アテナ
とは疎遠だったのですが、いろいろと使いどころがあると思
うし、面白いですね。これからはログまわりのブログも書くぞ!
Developers.IO を通じて、技術の「面白さ」を伝えれるように、これからもブログ書いて行きます!
以上!大阪オフィスの丸毛(@marumo1981)でした!